package template

// ZORM_CRUDMethod CRUD method
const ZORM_CRUDMethod = `

// Save{{.PyModelStructName}} 保存 {{.TableComment}}:{{.StructComment}}
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func Save{{.PyModelStructName}}(ctx context.Context, entity *{{.ModelPkgPath}}.{{.PyModelStructName}}) error {

	// entity对象指针不能为空
	if entity == nil {
		return errors.New("{{.PyModelStructName}} 的entity对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, err := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, er := zorm.Insert(ctx, entity)

		if er != nil {
			return nil, er
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if err != nil {
		e := fmt.Errorf("service.Save{{.PyModelStructName}}错误:%w", err)
		fmt.Println(e)
		return err
	}

	return nil
}

// Update{{.PyModelStructName}} 更新 {{.TableComment}}:{{.StructComment}}
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func Update{{.PyModelStructName}}(ctx context.Context, entity *{{.ModelPkgPath}}.{{.PyModelStructName}}) error {

	// entity对象指针或主键Id不能为空
	if entity == nil {
		return errors.New("{{.PyModelStructName}} 的entity对象指针不能为空")
	}
    {{if .PKColumnName}}
       {{if eq .PKColumnType "int32" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "int64" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float32" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float64" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "string" }}
          if len(entity.{{.PKColumnName}}) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "[]byte" }}
          if entity.{{.PKColumnName}} == nil || len(entity.{{.PKColumnName}}) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "time.Time" }}
          if entity.{{.PKColumnName}}.IsZero() {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{ else }}
    {{end}}
   {{end}}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, err := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, er := zorm.Update(ctx, entity)

		if er != nil {
			return nil, er
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if err != nil {
		e := fmt.Errorf("service.Update{{.PyModelStructName}}错误:%w", err)
		fmt.Println(e)
		return e
	}

	return nil
}

// UpdateNotZero{{.PyModelStructName}}更新 {{.TableComment}}:{{.StructComment}}
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZero{{.PyModelStructName}}(ctx context.Context, entity *{{.ModelPkgPath}}.{{.PyModelStructName}}) error {

	// entity对象指针或主键Id不能为空
	if entity == nil {
		return errors.New("{{.PyModelStructName}} 的entity对象指针不能为空")
	}
    {{if .PKColumnName}}
       {{if eq .PKColumnType "int32" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "int64" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float32" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float64" }}
          if entity.{{.PKColumnName}} < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "string" }}
          if len(entity.{{.PKColumnName}}) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "[]byte" }}
          if entity.{{.PKColumnName}} == nil || len(entity.{{.PKColumnName}}) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "time.Time" }}
          if entity.{{.PKColumnName}}.IsZero() {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{ else }}
    {{end}}
   {{end}}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, err := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, er := zorm.UpdateNotZeroValue(ctx, entity)

		if er != nil {
			return nil, er
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if err != nil {
		e := fmt.Errorf("service.UpdateNotZero{{.PyModelStructName}}错误:%w", err)
		fmt.Println(e)
		return e
	}

	return nil
}

{{if .PKColumnName}}
// Delete{{.PyModelStructName}}ById 根据Id删除 {{.TableComment}}:{{.StructComment}}
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func Delete{{.PyModelStructName}}ById(ctx context.Context ,pk {{.PKColumnType}}) error {

	//id不能为空
       {{if eq .PKColumnType "int32" }}
          if pk < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "int64" }}
          if pk < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float32" }}
          if pk < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float64" }}
          if pk < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "string" }}
          if len(pk) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "[]byte" }}
          if pk == nil || len(pk) < 1 {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "time.Time" }}
          if pk.IsZero() {
             return errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{ else }}
    {{end}}


	//匿名函数return的error如果不为nil,事务就会回滚
	_, err := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder({{.ModelPkgPath}}.TableName{{.PyModelStructName}}).Append(" WHERE {{.PKColumnName}}=?", pk)
		_, er := zorm.UpdateFinder(ctx, finder)

		if er != nil {
			return nil, er
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if err != nil {
		e := fmt.Errorf("service.Delete{{.PyModelStructName}}错误:%w", err)
		fmt.Println(e)
		return e
	}

	return nil
}
{{end}}

{{if .PKColumnName}}
// Find{{.PyModelStructName}}ById 根据Id查询信息 {{.TableComment}}:{{.StructComment}}
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func Find{{.PyModelStructName}}ById(ctx context.Context ,pk {{.PKColumnType}}) (*{{.ModelPkgPath}}.{{.PyModelStructName}}, error) {
	//id不能为空
       {{if eq .PKColumnType "int32" }}
          if pk < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "int64" }}
          if pk < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float32" }}
          if pk < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "float64" }}
          if pk < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "string" }}
          if len(pk) < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "[]byte" }}
          if pk == nil || len(pk) < 1 {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{else if eq .PKColumnType "time.Time" }}
          if pk.IsZero() {
             return nil,errors.New("{{.PyModelStructName}} 的entity对象指针主键不能为空")
          }
       {{ else }}
    {{end}}

	//根据Id查询
	finder := zorm.NewSelectFinder({{.ModelPkgPath}}.TableName{{.PyModelStructName}}).Append(" WHERE {{.PKColumnName}}=?", pk)
	entity := {{.ModelPkgPath}}.{{.PyModelStructName}}{}
	has, err := zorm.QueryRow(ctx, finder, &entity)

	//记录错误
	if err != nil {
		er := fmt.Errorf("service.Find{{.PyModelStructName}}ById错误:%w", err)
		fmt.Println(er)
		return nil, er
	}

	if !has {
		return nil, nil
	}

	return &entity, nil

}
{{end}}

// Find{{.PyModelStructName}}List 根据Finder查询列表 {{.TableComment}}:{{.StructComment}}
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func Find{{.PyModelStructName}}List(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]{{.ModelPkgPath}}.{{.PyModelStructName}}, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	entityList := make([]{{.ModelPkgPath}}.{{.PyModelStructName}}, 0)
	err := zorm.Query(ctx, finder, &entityList, page)

	//记录错误
	if err != nil {
		er := fmt.Errorf("service.Find{{.PyModelStructName}}List错误:%w", err)
		fmt.Println(er)
		return nil, er
	}

	return entityList, nil
}


`
